#![no_std]
#![no_main]

#[macro_use]
extern crate user_lib;

use user_lib::{get_time, set_priority};

/*
理想结果：6个进程退出时，输出 count 基本正比于 priority
*/

fn spin_delay() {
    let mut j = true;
    for _ in 0..10 {
        j = !j;
    }
}

// to get enough accuracy, MAX_TIME (the running time of each process) should > 1000 mseconds.
const MAX_TIME: isize = 1000;
pub fn count_during(prio: isize) -> isize {
    let mut acc = 0;
    set_priority(prio);
    let start_time = get_time();
    loop {
        spin_delay();
        acc += 1;
        if acc % 40000000 == 0 {
            println!("Task 0 running...");
        }
        if acc % 400000000 == 0 {
            let time = get_time() - start_time;
            if time > MAX_TIME {
                return time;
            }
        }
    }
}

#[no_mangle]
pub fn main() -> usize {
    let prio = 5;
    let count = count_during(prio);
    println!("priority = {}, exitcode = {}", prio, count);
    0
}
